Users of computing environments often encounter a need to automate various tasks. End users may wish to automate frequently performed individual tasks, while information technology (IT) personnel may be tasked with automating large tasks that span many computer systems. Tasks may include actions such as application installation and maintenance, computer setup, security verification, updating an inventory of systems and applications, and so forth.
Workflows provide one method of automating tasks in computing environments. Software programming has evolved over time from writing applications in low-level languages, such as assembly, to high-level languages like C++, C#, and Visual Basic. Higher-level languages often remove low-level management of memory and other machine-based limitations in favor of allowing the programmer to think more in terms of objects that represent the problem to be solved. However, there is still much complexity in application logic, particularly when managing asynchronous processing. Workflows, such as those provided by MICROSOFT™ WINDOWS™ Workflow Foundation (WF), provide a declarative framework for formulating application and service logic in a high-level manner as one or more workflows. Workflows are made of activities that process a particular stage of the application's processing. A group of activities forms a workflow. Workflows can be paused and resumed as applications wait for responses from other components, and are particularly well suited to asynchronous programming to improve developer productivity. WF provides a set of tools for declaring workflows, activities to help define the logic and control flow, and a runtime for executing the resulting application definition.
Scripting provides another method of automating tasks in computing environments. Scripting generally includes a scripting language and host that reads a text file or console input that provides instructions in the scripting language to carry out a variety of actions. Unlike workflows, scripts are generally much less formal and do not demand the same programmatic knowledge common to traditional software programming. Scripts can be built and tested quickly with little more tools than a text editor and the scripting host.
Unfortunately, these existing methods lie at opposite extremes of the spectrum of automating tasks, and each includes limitations that make it difficult to use for particular tasks. For example, building workflows generally involves setting up a programming environment (such as MICROSOFT™ Visual Studio) and acquiring programming skills to develop and debug workflows. This limits their accessibility and increases the expense of automating tasks. Limited programmer resources can become a bottleneck for getting things done. Scripting, while great for small, single-machine tasks, is much more difficult to use for longer tasks with potentially many dependent steps that span potentially many computer systems. In particular, scripting lacks the kind of error detection and error handling available in higher level programming languages, and is not good at stopping, recovering, and restarting after errors or unexpected events. One example of a set of steps that is difficult to perform with scripting is any task that involves rebooting a computer system. Once the system is rebooted, the script is no longer running and cannot resume at some correct point when the computer system restarts.